<?php

# 1. 封锁 new 操作 (__construct 私有化)
# 2. 留下接口来 new 操作 (sigle::getIns())
# 3. getIns 预先判断实例
# 4. 用 final, 防止继承时,被修改权限
# 5. 禁止克隆
class sigle
{
    protected static $ins = null;
    public static function getIns()
    {
        if (self::$ins === null) {
            self::$ins = new self();
        }
        return self::$ins;
    }

    # 方法前加 final,则方法不能被覆盖,
    # 类前加 final,则类不能被继承
    final protected function __construct()
    {
        # code...
    }

    # 封锁 clone
    final protected function __clone()
    {}
}

$s1 = sigle::getIns();
$s2 = sigle::getIns();

# 4. 继承 final后的方法, 此函数报错
// class multi extends sigle
// {

//     public function __construct()
//     {
//         # code...
//     }
// }

// $s1 = new multi();
// $s2 = new multi();

// if ($s1 === $s2) {
//     echo "===";
// }else{
//     echo "!==";
// }

# 5. 克隆
$s1 = sigle::getIns();
$s2 = clone $s1; // 被克隆了,又产成了多个对象

if ($s1 === $s2) {
    echo "===";
} else {
    echo "!==";
}
